home *** CD-ROM | disk | FTP | other *** search
- /*
- Towns Menu-Bar ver. 0.001
- 各色画面モード対応
- Copyright(C) 1993 Okome
- */
-
- #include <string.h>
- #include <EGB.H>
- #include <MOS.H>
- #include <sidework.h>
- #include <normlib.h>
- #include <okome.h>
- #include <col.h>
-
- extern char work[];
- extern char *MEN_title[];
- extern int MEN_kazu[];
- static int mex[16], mel[16], ebf;
- int MEN_si=0, MEN_ss;
-
- static int ml( int i )
- {
- int k, l=0;
- for (k=0; k<=i; k++)
- l+=MEN_kazu[k];
- return (l);
- }
-
- static int ubs( int i, int m )
- {
- static int j=-1, n=0;
- int k, l;
- if (j != i)
- {
- if (j >= 0)
- {
- ubox2( mex[j], 0, mex[j+1]-1, 19, cl15, cl8 );
- OKM_gth(mex[j],20,mex[j]+mel[j],23+MEN_kazu[j+1]*16,0);
- }
- j = i;
- n = 0;
- if (i >= 0)
- {
- ubox2( mex[i], 0, mex[i+1]-1, 19, colorch[1+(i==0)*7], colorch[1+(i==0)*7] );
- OKM_gth(mex[j],20,mex[j]+mel[j],23+MEN_kazu[j+1]*16,1);
- boxbf( mex[i], 20, mex[i]+mel[i]-2, 21+MEN_kazu[i+1]*16, cl8, cl15 );
- boxb( mex[i], 20, mex[i]+mel[i]-1, 22+MEN_kazu[i+1]*16, cl8 );
- boxb( mex[i], 20, mex[i]+mel[i], 23+MEN_kazu[i+1]*16, cl8 );
- l = ml(i);
- for (k=0; k<MEN_kazu[i+1]; k++)
- {
- font12( mex[i]+8, 34+k*16, MEN_title[l+k], cl8 );
- }
- }
- }
- if ( i>=0 )
- {
- if ( m!=n )
- {
- EGB_writeMode( work, 4 );
- if (n>0)
- {
- boxf( mex[i]+1, n*16+5, mex[i]+mel[i]-3, n*16+20, cl15^cl8 );
- }
- if (m>0)
- {
- boxf( mex[i]+1, m*16+5, mex[i]+mel[i]-3, m*16+20, cl15^cl8 );
- }
- EGB_writeMode( work, 0 );
- n = m;
- }
- if (m > 0)
- {
- if (i==0 && MEN_si<m && MEN_si+MEN_ss-1>m)
- {
- sdk_chain(m-MEN_si);
- return (8000+m-MEN_si);
- } else {
- return (i*100+m);
- }
- }
- }
- return (0);
- }
-
- static int menx(int mx)
- {
- int i = 1;
- while ( mex[i] <= mx )
- i++;
- return (i-1);
- }
-
- static int mebox( int mb, int k )
- {
- int i = 0, j, mx, my, l;
- l = k*23;
- while (mb != 0)
- {
- MOS_rdpos( &mb, &mx, &my );
- j=i;
- i = ( mx >= 610-l && mx <=629-l && my < 20 ) ? 1 : 0 ;
- if (j!=i)
- {
- MOS_disp( 0 );
- ubox2( 610-l, 0, 629-l, 19, colorch[15-i*7], cl8 );
- MOS_disp( 1 );
- }
- }
- MOS_disp( 0 );
- ubox2( 610-l, 0, 629-l, 19, cl15, cl8 );
- MOS_disp( 1 );
- return (i);
- }
-
- int MEN_menu( int mb, int mx, int my )
- {
- int p, i, r = 0, j = -1, z = 1, mb2;
- p = EGB_getWritePage( 0, 0 );
- EGB_writePage( work, 0 );
- if ( mb && mex[MEN_kazu[0]] > mx && my < 20 )
- {
- while ( z != 0 )
- {
- mb2 = mb;
- MOS_rdpos( &mb, &mx, &my );
- if ( mex[MEN_kazu[0]] > mx && my < 20 )
- {
- if ( mb )
- {
- i = menx(mx);
- if ( j!=i || r )
- {
- MOS_disp( 0 );
- r = ubs( i, 0 );
- MOS_disp( 1 );
- j = i;
- }
- z = 2;
- } else {
- z = 1;
- }
- }
- if ( mex[j] <= mx && mex[j]+mel[j] >= mx &&
- 20 < my && my < 21 + MEN_kazu[j+1] * 16 )
- {
- if (mb!=0)
- { /* SUB menuの処理 */
- i = (my - 21) / 16;
- MOS_disp( 0 );
- r = ubs( j, i+1 );
- MOS_disp( 1 );
- z = 3;
- } else {
- if ( z==3 && mb2 )
- {
- z = 0;
- }
- if ( z==2 )
- {
- z = 1;
- }
- }
- } else {
- if ( z==3 && mb)
- {
- MOS_disp( 0 );
- r = ubs(j, 0);
- MOS_disp( 1 );
- z = 4;
- }
- if ( (mex[MEN_kazu[0]] > mx && my < 20)==0 )
- {
- if (((z==1) && mb) || ((z==2 || z==4) && mb==0))
- {
- z = 0;
- }
- }
- }
- }
- MOS_disp( 0 );
- ubs( -1, 0 );
- MOS_disp( 1 );
- do {
- MOS_rdpos( &mb, &mx, &my );
- } while( mb != 0 );
- } else {
- if ( mx >= 633-23*ebf && mx <= 629 && my < 20 && (629-mx) % 23 < 20)
- { /* ENDボタン */
- i = (629-mx) / 23;
- if (mebox( mb, i ))
- r = 9999 - i;
- }
- }
- EGB_writePage( work, p );
- return (r);
- }
-
- void MEN_set( int b )
- {
- int i, j=0, k, l;
- boxbf( 0, 0, 639, 19, cl0, cl7 );
- ebf = b;
- for (i = 0; i < MEN_kazu[0]; i++)
- {
- j += strlen(MEN_title[i])*6+34;
- mex[i+1] = j;
- boxf( mex[i], 0, j-1, 19, colorch[1+(i==0)*7] );
- ubox2( mex[i], 0, j-1, 19, cl15, cl8 );
- font12( mex[i]+13, 16, MEN_title[i], cl15 );
- l = ml(i);
- for (k=0; k<MEN_kazu[i+1]; k++)
- {
- if ( strlen(MEN_title[l+k])*6+16 > mel[i] )
- mel[i] = strlen(MEN_title[l+k])*6+18;
- }
- }
- for (i = 0; i < b; i++)
- {
- boxf( 610-i*23, 0, 629-i*23, 19, cl8 );
- ubox2( 610-i*23, 0, 629-i*23, 19, cl15, cl8 );
- }
- }
-